package schema

import (
	"errors"
	"jgt-oper/src/util"
	"strings"
)

// User 用户管理
type User struct {
	ID           int64  `json:"id" bson:"_id" structs:"id"`                                 // 自增ID
	RecordID     string `json:"record_id" bson:"record_id" structs:"record_id"`             // 记录ID
	Account      string `json:"account" bson:"account" structs:"account"`                   // 用户账号
	Nickname     string `json:"nickname" bson:"nickname" structs:"nickname"`                // 昵称
	RealName     string `json:"real_name" bson:"real_name" structs:"real_name"`             // 真实姓名
	Photo        string `json:"photo" bson:"photo" structs:"photo"`                         // 头像
	EnterpriseID string `json:"enterprise_id" bson:"enterprise_id" structs:"enterprise_id"` // 企业ID
	UserType     string `json:"user_type" bson:"user_type" structs:"user_type"`             // 用户类型(10:游客 20:未认证 30:企业员工 40:企业管理员)
	Gender       int    `json:"gender" bson:"gender" structs:"gender"`                      // 性别(1:男 2:女)
	Post         string `json:"post" bson:"post" structs:"post"`                            // 岗位名称
	AuthStatus   int    `json:"auth_status" bson:"auth_status" structs:"auth_status"`       // 认证状态(1:已认证 2:未认证)
	LoginType    int    `json:"login_type" bson:"login_type" structs:"login_type"`          //登录方式
	Created      int64  `json:"created" bson:"created" structs:"created"`                   // 创建时间戳
	Operator     string `json:"operator" bson:"operator" structs:"operator"`                // 操作人
	Deleted      int64  `json:"deleted" bson:"deleted" structs:"deleted"`                   // 删除时间戳
	BanMsg       bool   `json:"ban_msg" bson:"ban_msg" structs:"ban_msg"`                   //禁发私信
	BanLogin     bool   `json:"ban_login" bson:"ban_login" structs:"ban_login"`             //禁止登陆
	BanEssay     bool   `json:"ban_essay" bson:"ban_essay" structs:"ban_essay"`             //禁发文章
	BanComment   bool   `json:"ban_comment" bson:"ban_comment" structs:"ban_comment"`       //禁发评论
}

// Validate 验证参数
func (a *User) Validate() error {
	if a.RecordID == "" {
		return errors.New("无效的请求参数")
	}
	return nil
}

// UpdateUserRegisterInfo 更新用户注册信息
type UpdateUserRegisterInfo struct {
	Photo    string `json:"photo" bson:"photo" structs:"photo"`          // 头像
	Nickname string `json:"nickname" bson:"nickname" structs:"nickname"` // 昵称
	Gender   int    `json:"gender" bson:"gender" structs:"gender"`       // 性别(1:男 2:女)
}

// Validate 验证参数
func (a *UpdateUserRegisterInfo) Validate() error {
	if util.Trim(a.Nickname) == "" ||
		!(a.Gender == 1 || a.Gender == 2) ||
		(a.Photo != "" && !strings.HasPrefix(a.Photo, "/s/")) {
		return errors.New("无效的请求参数")
	}
	return nil
}

// UserCommonFunction 用户常用功能
type UserCommonFunction struct {
	UserID    string   `json:"user_id" bson:"_id" structs:"user_id"`           // 用户ID
	Functions []string `json:"functions" bson:"functions" structs:"functions"` // 功能项ID
}

// UserSetting 用户设置
type UserSetting struct {
	UserID   string           `json:"user_id" bson:"_id"`       // 用户ID
	Settings *UserSettingItem `json:"settings" bson:"settings"` // 设置
}

// UserSettingItem 用户设置项
type UserSettingItem struct {
	IsSound     int `json:"is_sound"`     // 声音(1:开启 2:关闭)
	IsVibration int `json:"is_vibration"` // 振动(1:开启 2:关闭)
}

// Validate 验证参数
func (a *UserSettingItem) Validate() error {
	if a.IsSound == 0 ||
		a.IsVibration == 0 {
		return errors.New("无效的请求参数")
	}
	return nil
}

// String 序列化方法
func (a *UserSettingItem) String() string {
	return util.JSONMarshalToString(a)
}

// UserQueryParam 用户查询条件
type UserQueryParam struct {

	//直接条件
	Nickname     string `json:"nickname" bson:"nickname" structs:"nickname"`    // 昵称
	RealName     string `json:"real_name" bson:"real_name" structs:"real_name"` // 真实姓名
	EnterpriseID string `json:"enterprise_id" structs:"enterprise_id"`          // 企业ID
	UserType     string `json:"user_type" structs:"user_type"`                  // 用户类型(10:游客 20:未认证 30:企业员工 40:企业管理员)
	Gender       int    `json:"gender"  structs:"gender"`                       // 性别(1:男 2:女)
	Post         string `json:"post"  structs:"post"`                           // 岗位名称
	AuthStatus   int    `json:"auth_status" structs:"auth_status"`              // 认证状态(1:已认证 2:未认证)
	From         int64  `json:"from" structs:"from"`                            // 注册起始时间戳
	To           int64  `json:"to" structs:"to"`                                // 注册终止时间戳
	LoginType    string `json:"login_type" structs:"login_type"`                //登录方式

	//间接条件
	EnterpriseName string `json:"enterprice_name" structs:"enterprice_name"` //所属企业名
	Tel            string `json:"tel" structs:"tel"`                         //联系电话
	Status         int    `json:"status" structs:"status"`                   //状态 0:全部,1:正常,2:注销

	Search  string   `json:"search" structs:"search"` //模糊查询
	BanList []string `json:"ban_list"`                //禁止项列表
}

// UserShow 用户信息展示
type UserShow struct {
	//基本信息
	ID           int64  `json:"id"`            // 自增ID
	RecordID     string `json:"record_id"`     // 记录ID
	Nickname     string `json:"nickname"`      // 昵称
	RealName     string `json:"real_name"`     // 真实姓名
	Photo        string `json:"photo"`         // 头像
	EnterpriseID string `json:"enterprise_id"` // 企业ID
	UserType     string `json:"user_type"`     // 用户类型(10:游客 20:未认证 30:企业员工 40:企业管理员)
	Gender       int    `json:"gender"`        // 性别(1:男 2:女)
	Post         string `json:"post"`          // 岗位名称
	AuthStatus   int    `json:"auth_status"`   // 认证状态(1:已认证 2:未认证)
	Created      int64  `json:"created"`       // 创建时间戳
	Operator     string `json:"operator"`      // 操作人
	//补充信息
	Tel            string `json:"tel"`             //电话
	EnterpriseName string `json:"enterprise_name"` //企业名称
	LoginType      string `json:"login_type"`      //登录方式
	Status         int    `json:"status"`          //状态
	Sign           string `json:"sign"`            //签名
	Birthday       string `json:"birthday"`        //生日

	//禁止项
	BanMsg     bool `json:"ban_msg"`     // 禁止私信
	BanLogin   bool `json:"ban_login"`   // 禁止登陆
	BanEssay   bool `json:"ban_essay"`   // 禁发文章
	BanComment bool `json:"ban_comment"` //禁发评论
}

// UserCount 用户统计
type UserCount struct {
	All    int64 //全部数量
	Auth   int64 //已认证数量
	UnAuth int64 //未认证数量
}

// UserSlice 分片
type UserSlice []*User

// Len 排序接口方法
func (a UserSlice) Len() int {
	return len(a)
}

// Swap 排序接口方法
func (a UserSlice) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

// Less 排序接口方法
func (a UserSlice) Less(i, j int) bool {
	return a[i].EnterpriseID < a[j].EnterpriseID
}

// QueryResultColleagues 返回数据格式
type QueryResultColleagues struct {
	RecordID string `bson:"record_id""`
	RealName string `bson:"real_name"`
	Pinyin   string
}

// QueryResultColleaguesSlice 分片
type QueryResultColleaguesSlice []*QueryResultColleagues

// Len 排序接口方法
func (a QueryResultColleaguesSlice) Len() int {
	return len(a)
}

// Swap 排序接口方法
func (a QueryResultColleaguesSlice) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

// Less 排序接口方法
func (a QueryResultColleaguesSlice) Less(i, j int) bool {
	return a[i].Pinyin < a[j].Pinyin
}

// UserItemDetail 用户信息详情
type UserItemDetail struct {
	AuthState      int    `json:"auth_state" bson:"auth_state"`
	NamePinyin     string `json:"name_pinyin" bson:"name_pinyin"`
	Nickname       string `json:"nickname" bson:"nickname"`
	Photo          string `json:"photo" bson:"photo"`
	Post           string `json:"post" bson:"post"`
	RealName       string `json:"real_name" bson:"real_name"`
	RecordID       string `json:"record_id" bson:"record_id"`
	Tag            string `json:"tag"`
	Tel            string `json:"tel" bson:"tel"`
	Added          int    `json:"added"`
	Created        int64  `json:"created" bson:"created"`
	Gender         int    `json:"gender" bson:"gender"`
	UserType       string `json:"user_type" bson:"user_type"`
	EnterpriseID   string `json:"enterprise_id" bson:"enterprise_id"`
	EnterpriseName string `json:"enterprise_name" bson:"enterprise_name"`
	LoginType      int    `json:"login_type" bson:"login_type"`
}

// UserDetailArray 分片
type UserDetailArray []*UserItemDetail

// CurrentPageItems 分片
type CurrentPageItems []*UserItemDetail

// Len 排序接口方法
func (a CurrentPageItems) Len() int {
	return len(a)
}

// Swap 排序接口方法
func (a CurrentPageItems) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

// Less 排序接口方法
func (a CurrentPageItems) Less(i, j int) bool {
	return a[i].NamePinyin < a[j].NamePinyin
}

// QueryUserItem 查询参数
type QueryUserItem struct {
	AuthState  int    `json:"auth_state" bson:"auth_state"`
	NamePinyin string `json:"name_pinyin" bson:"name_pinyin"`
	Nickname   string `json:"nickname" bson:"nickname"`
	Photo      string `json:"photo" bson:"photo"`
	Post       string `json:"post" bson:"post"`
	RealName   string `json:"real_name" bson:"real_name"`
	RecordID   string `json:"record_id" bson:"record_id"`
	Tag        string `json:"tag"`
	Tel        string `json:"tel" bson:"tel"`
	Added      int    `json:"added"`
}

// Count 数量
type Count struct {
	Total int `json:"total" bson:"total"`
}
